#ifndef CLIENTGUI_H
#define CLIENTGUI_H

#include <QObject>
#include <QStringList>
#include "dcpp/ClientListener.h"
#include "dcpp/stdinc.h"

using std::string;

class HubData;
namespace dcpp {
    class Client;
}

/** Объвязка вокруг класса dcpp::Client добовляющая
 * функционал, необходимый для использования в
 * модели GUI.
 *
 * @author Василий Почкаенко. */
class ClientGUI : public QObject,
        public dcpp::ClientListener{
	Q_OBJECT
	/** Пароль.*/
	Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChange)
    /** Кодировка.*/
    Q_PROPERTY(QString encoding READ encoding WRITE setEncoding NOTIFY encodingChange)
    /** Имя пользователя.*/
    Q_PROPERTY(QString currentNick READ currentNick WRITE setCurrentNick NOTIFY currentNickChange)
    /** Описание.*/
    Q_PROPERTY(QString currentDescription READ currentDescription WRITE setCurrentDescription NOTIFY currentDescriptionChange)
    /** Порт.*/
    Q_PROPERTY(QString port READ port NOTIFY portChange)
    /** IP.*/
    Q_PROPERTY(QString ip READ ip NOTIFY ipChange)
    /** Адрес.*/
    Q_PROPERTY(QString address READ address NOTIFY addressChange)
    /** Имя хаба.*/
    Q_PROPERTY(QString hubName READ hubName NOTIFY hubNameChange)
    /** Строки чата.*/
    Q_PROPERTY(QStringList chat READ chat NOTIFY chatChange)
private:
    /** Указатель на оборачивемый клиент. */
    dcpp::Client * m_client;

    /** Сообщения чата.*/
    QStringList m_chat;

    /** Вызвать все сигналы об изменении свойств.*/
    void emitAllChanged();

    void saveToFavoriteHubParam(const QString &name, const QString &value);
public:
    explicit ClientGUI(dcpp::Client *client, QObject *parent = 0);
	
	/** Пароль.*/
    QString password() const noexcept;
	/** Установить пароль.*/
    void setPassword(const QString & password) noexcept;
    /** Кодировка.*/
    QString encoding() const noexcept;
    /** Установить кодировку.*/
    void setEncoding(const QString & encoding) noexcept;
    /** Имя пользователя.*/
    QString currentNick() const noexcept;
    /** Установить имя пользователя.*/
    void setCurrentNick(const QString & currentNick) noexcept;
    /** Описание.*/
    QString currentDescription() const noexcept;
    /** Установить описание.*/
    void setCurrentDescription(const QString currentDescription) noexcept;
    /** Порт.*/
    QString port() const noexcept;
    /** IP.*/
    QString ip() const noexcept;
    /** Адрес.*/
    QString address() const noexcept;
    /** Имя хаба.*/
    QString hubName() const noexcept;    
    /** Строки чата.*/
    const QStringList &chat() const noexcept;






    // Слушатель dcpp::ClientManager

    void on(dcpp::ClientListener::Connecting, dcpp::Client*) noexcept;
    void on(dcpp::ClientListener::Connected, dcpp::Client*) noexcept;
    void on(dcpp::ClientListener::UserUpdated, dcpp::Client*, const dcpp::OnlineUser&) noexcept;
    void on(dcpp::ClientListener::UsersUpdated, dcpp::Client*, const dcpp::OnlineUserList&) noexcept;
    void on(dcpp::ClientListener::UserRemoved, dcpp::Client*, const dcpp::OnlineUser&) noexcept;
    void on(dcpp::ClientListener::Redirect, dcpp::Client*, const string&) noexcept;
    void on(dcpp::ClientListener::Failed, dcpp::Client*, const string&) noexcept;
    void on(dcpp::ClientListener::GetPassword, dcpp::Client*) noexcept;
    void on(dcpp::ClientListener::HubUpdated, dcpp::Client*) noexcept;
    void on(dcpp::ClientListener::Message, dcpp::Client*, const dcpp::ChatMessage&) noexcept;
    void on(dcpp::ClientListener::StatusMessage, dcpp::Client*, const string&, int = FLAG_NORMAL) noexcept;
    void on(dcpp::ClientListener::HubUserCommand, dcpp::Client*, int, int, const string&, const string&) noexcept;
    void on(dcpp::ClientListener::HubFull, dcpp::Client*) noexcept;
    void on(dcpp::ClientListener::NickTaken, dcpp::Client*) noexcept;
    void on(dcpp::ClientListener::SearchFlood, dcpp::Client*, const string&) noexcept;
    void on(dcpp::ClientListener::NmdcSearch, dcpp::Client*, const string&, int, int64_t, int, const string&) noexcept;
    void on(dcpp::ClientListener::AdcSearch, dcpp::Client*, const dcpp::AdcCommand&, const dcpp::CID&) noexcept;

signals:
	/** Изменился пароль.*/
	void passwordChange();
    /** Изменилась кодировка.*/
    void encodingChange();
    /** Изменилось имя пользователя.*/
    void currentNickChange();
    /** Изменилось описание.*/
    void currentDescriptionChange();
    /** Изменился порт.*/
    void portChange();
    /** Изменился IP.*/
    void ipChange();
    /** Изменился адрес.*/
    void addressChange();
    /** Изменилось имя хаба.*/
    void hubNameChange();
    /** Изменилось Строки чата.*/
    void chatChange();
public slots:
	
protected:
    ~ClientGUI();
};

#endif // CLIENTGUI_H
